﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Runtime.Serialization;
using System.Xml;
using System.Xml.Serialization;

namespace RegExStudio
{
    /// <summary>
    /// Läd eine Liste von Farben aus den Resourcen und generiert den Farbverlauf
    /// Singleton Klasse
    /// </summary>
    public class ColorManager 
    {
        /// <summary>
        /// Serialisierte Form der Farben
        /// </summary>
        private Xml.Colors _colors;

        private static ColorManager _instance;

        /// <summary>
        /// Die einzige Instanz mit der gearbeitet wird
        /// </summary>
        public static ColorManager Instance
        {
            get 
            {
                if (_instance == null)
                {
                    _instance = new ColorManager();
                }
                return _instance;
            }
        }

        /// <summary>
        /// ctor
        /// Läd die serialisierte Liste der Farben aus den Resourcen
        /// </summary>
        private ColorManager()
        {
            XmlSerializer serializer = new XmlSerializer(typeof(Xml.Colors));
            StringReader stringReader = new StringReader(Properties.Resources.Colors);
            XmlTextReader xmlReader = new XmlTextReader(stringReader);
            _colors = (Xml.Colors)serializer.Deserialize(xmlReader);
            xmlReader.Close();
            stringReader.Close();
        }

        /// <summary>
        /// Liefert die zu einer Gruppe gehörende Farbe
        /// </summary>
        /// <param name="n">Index der Group</param>
        /// <returns>Die ermittelte System.Drawing.Color</returns>
        public System.Drawing.Color GetColor(int n)
        {
            System.Drawing.Color color;

            if (n > _colors.Items.Count - 1)
            {
                int rest = n % _colors.Items.Count;

                color = System.Drawing.Color.FromArgb(_colors.Items[rest].R, _colors.Items[rest].G, _colors.Items[rest].B);
            }
            else
            {
                color = System.Drawing.Color.FromArgb(_colors.Items[n].R, _colors.Items[n].G, _colors.Items[n].B);
            }
            return color;
        }

        /// <summary>
        /// Liefert die aufgehellte Farbe einer Gruppe zu einem Index
        /// Es gibt von jeder Farbe nur maximal Properties.Settings.Default.GradientColorMaxSteps stufen.
        /// Danach wiederholt sich der Farbverlauf
        /// </summary>
        /// <param name="baseColor">Die Basisfarbe der Group</param>
        /// <param name="captureNumber">Der Zähler der Captures</param>
        /// <returns></returns>
        public System.Drawing.Color GetGradientColor(System.Drawing.Color baseColor, int captureNumber)
        {
            const int max = 255;

            int gradientStep = Properties.Settings.Default.GradientColorMaxSteps;

            if (captureNumber < Properties.Settings.Default.GradientColorMaxSteps)
            {
                gradientStep = captureNumber;
            }
            else if (captureNumber >= Properties.Settings.Default.GradientColorMaxSteps)
            {
                gradientStep = captureNumber % Properties.Settings.Default.GradientColorMaxSteps;
            }

            int addition = gradientStep * Properties.Settings.Default.GradientColorFactor;

            int r = Math.Min(baseColor.R + addition, max);
            int g = Math.Min(baseColor.G + addition, max);
            int b = Math.Min(baseColor.B + addition, max);

            return System.Drawing.Color.FromArgb(r, g, b);
        }
    }
}
